package main

import (
	"fmt"
)
// 返回值类型要写在最后面
func eval(a, b int, op string)int{
	switch op {
	case "+":
		return a + b
	case "-":
		return a - b
	case "*":
		return a * b
	case "/":
		return a / b
	default:
		panic("unsupported operation: " + op)
		return -1
	}
}

// 函数可以返回多个值
func div(a, b int) (int, int) {
	return a / b, a % b
}

// 可变参数列表   没有默认参数，可选参数
func sum (number ...int) int {
	s := 0
	for i := range number {
		s += number[i]
	}
	return s
}

// 函数的闭包
// 闭包是一个函数值，它来自函数体的外部的变量引用。
// 函数可以对这个引用值进行访问和赋值; 换句话说这个函数被绑定在这个变量上
func adder() func(int) int {  // 函数会返回一个返回int的函数
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	eval(3, 4 , "*")
	q, r := div(11,3)
	fmt.Println(div(11,2))
	fmt.Println(q, r)
	fmt.Println(sum(1,2,3,4,5,6,7,8))

	// 函数addr返回一个闭包，每个闭包被绑定到其各自的sum变量上
	pos, neg := adder(), adder()
	for i := 0; i<10; i++ {
		fmt.Println(
		pos(i),
		neg(-2*i),
		)
	}
}